home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.mactech.com 2010
/
ftp.mactech.com.tar
/
ftp.mactech.com
/
machack
/
Hacks96
/
RoasterJavaWAHTTPCGI.sit
/
Roaster-Java-WA-HTTP-CGI hack
/
JavaWebStuff
/
DSJava.c
< prev
next >
Wrap
Text File
|
1996-06-22
|
15KB
|
631 lines
/*************************************************************************************
DSJava.c
written by Chris Evans & Rick Eames
(c) 1996 Natural Intelligence, Inc. All Rights Reserved.
This file holds the key to life for using Java in your applications.
Questions for Chris
*************************************************************************************/
#include "RoasterVM.h"
#include "JavaRuntime.h"
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "UnixPaths.h"
#include "DSUtils.h"
/*************************************************************************************
PROTOTYPES
*************************************************************************************/
static Handle GetFullPathName(FSSpec *inFileSpec);
static Boolean abortKeyPressed(void);
static Boolean ErrorWithFileNameAndLineNumber(char *str,long len);
static JavaStatus mac_tools_CompilerExceptionStream_writeBytes(JavaEnv env,
JavaRef thisRef, JavaRef arrayRef, JavaInt off, JavaInt len);
static JavaStatus mac_tools_CompilerErrorStream_writeBytes(JavaEnv env,
JavaRef thisRef, JavaRef arrayRef, JavaInt off, JavaInt len);
static JavaStatus mac_tools_CompilerErrorStream_writeBytes_stub(JavaEnv env);
static JavaStatus mac_tools_CompilerExceptionStream_writeBytes_stub(JavaEnv env);
OSErr Java_ProcessFile(FSSpec *inFSSpec);
short BuildClassPathStringHandle(Handle classPath,JavaRuntime runtime, FSSpec *inFSSpec);
/*************************************************************************************
abortKeyPressed
Was the command-period pressed during our operation?
*************************************************************************************/
static Boolean
abortKeyPressed(void)
{
KeyMap theKeys;
UInt8 *km = (UInt8 *) theKeys;
# define KEYDOWN(k) (((km[k>>3] >> (k & 7)) & 1) != 0)
GetKeys(theKeys);
return (KEYDOWN(0x37) && KEYDOWN(0x2F));
# undef KEYDOWN
}
/*************************************************************************************
GetFullPathName
Given an FSSpec, return a full pathname in a Handle.
*************************************************************************************/
static Handle
GetFullPathName(
FSSpec *inFileSpec)
{
Str255 theStr;
CInfoPBRec pb;
Handle theString;
char sep = '/';
if ((theString = NewHandle(0)) == NULL)
return NULL;
BlockMoveData(inFileSpec->name,
theStr, inFileSpec->name[0]+1);
Munger(theString, 0, 0, 0, &theStr[1], theStr[0]);
pb.hFileInfo.ioNamePtr = theStr;
pb.hFileInfo.ioVRefNum = inFileSpec->vRefNum;
pb.hFileInfo.ioCompletion = NULL;
pb.hFileInfo.ioFDirIndex = -1;
pb.dirInfo.ioDrDirID = inFileSpec->parID;
while (TRUE) {
if (PBGetCatInfoSync( &pb ))
break;
Munger(theString, 0, 0, 0, &sep, 1);
Munger(theString, 0, 0, 0, &theStr[1], theStr[0]);
pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID;
pb.hFileInfo.ioFDirIndex = -1;
}
Munger(theString, 0, 0, 0, &sep, 1);
return theString;
}
/*************************************************************************************
ErrorWithFileNameAndLineNumber
*************************************************************************************/
static Boolean
ErrorWithFileNameAndLineNumber(
char *str,
long len)
{
char *bytes = str;
while (*bytes != ':' && len)
{
bytes += 1;
len -= 1;
}
if (len && *bytes == ':')
{
bytes += 1;
len -= 1;
if (*bytes >= '0' && *bytes <= '9')
{
bytes += 1;
len -= 1;
while (*bytes != ':' && len)
{
bytes += 1;
len -= 1;
}
return (len && *bytes == ':');
}
}
return false;
}
/*************************************************************************************
mac_tools_CompilerExceptionStream_writeBytes
*************************************************************************************/
static JavaStatus
mac_tools_CompilerExceptionStream_writeBytes(
JavaEnv env,
JavaRef thisRef,
JavaRef arrayRef,
JavaInt off,
JavaInt len)
{
char *bytes;
FSSpec theSpec, appSpec;
short fRefNum;
OSErr theErr;
JavaStatus err;
GetAppFSSpec(&appSpec);
err = JavaArray_baseAddr(env, arrayRef, &bytes);
if (err != JavaStatusOk)
{
return err;
}
bytes += off;
theErr = UnixParsePath("javac_error.log",
appSpec.vRefNum, appSpec.parID, false, false, true, true, 'Rstr', 'TEXT', "\p", NULL, &theSpec);
theErr = FSpOpenDF(&theSpec, fsWrPerm, &fRefNum);
if (theErr == noErr)
{
SetFPos(fRefNum, fsFromLEOF, 0);
FSWrite(fRefNum, &len, bytes);
}
FSClose(fRefNum);
return JavaStatusOk;
}
/*************************************************************************************
mac_tools_CompilerErrorStream_writeBytes
*************************************************************************************/
static JavaStatus
mac_tools_CompilerErrorStream_writeBytes(
JavaEnv env,
JavaRef thisRef,
JavaRef arrayRef,
JavaInt off,
JavaInt len)
{
#if 1
FSSpec theSpec = { 0, 0, "\p" }, appSpec;
long lineNum = 0;
char *bytes;
JavaStatus err;
Boolean warning = false;
static char err_buffer[2000];
Boolean cancelNow;
static unsigned long nextMessageTicks = 0;
GetAppFSSpec(&appSpec);
err = JavaArray_baseAddr(env, arrayRef, &bytes);
if (err != JavaStatusOk)
{
return err;
}
bytes += off;
len = (sizeof(err_buffer) < len) ? sizeof(err_buffer) - 1 : len;
if (*bytes == ' ' || *bytes == '\t' || *bytes == '^')
{
return JavaStatusOk;
}
if (*bytes == '[')
{
strncpy(err_buffer, bytes + 1, len - 3);
err_buffer[len - 3] = '\0';
printf("%s\n",err_buffer);
cancelNow = abortKeyPressed();
if(cancelNow) {
return JavaStatusExceptionThrown;
}
return JavaStatusOk;
}
else if (ErrorWithFileNameAndLineNumber(bytes, len))
{
long i = 0;
while (*bytes != ':' && len)
{
err_buffer[i++] = *bytes++;
err_buffer[i] = '\0';
len -= 1;
}
if (*bytes == ':')
{
OSErr theErr;
theErr = UnixParsePath(err_buffer, appSpec.vRefNum,
appSpec.parID, false, false, false, true, 0, 0, "\p", NULL, &theSpec);
if (theErr == noErr)
{
bytes += 1;
len -= 1;
i = 0;
while (*bytes != ':' && len)
{
err_buffer[i++] = *bytes++;
err_buffer[i] = '\0';
len -= 1;
}
if (*bytes == ':')
{
lineNum = atoi(err_buffer);
bytes += 1;
len -= 1;
if (*bytes == ' ')
{
bytes += 1;
len -= 1;
}
if (memcmp(bytes, "Warning: ", 9) == 0)
{
bytes += 9;
len -= 9;
warning = true;
}
BlockMoveData(bytes, err_buffer, len);
err_buffer[len] = '\0';
}
else
{
return JavaStatusOk;
}
}
}
else
{
return JavaStatusOk;
}
}
else
{
BlockMoveData(bytes, err_buffer, len);
err_buffer[len] = '\0';
}
len = strlen(err_buffer);
if (len && err_buffer[len-1] < ' ') err_buffer[len-1] = '\0';
if(warning) {
printf("Warning: %s\n", err_buffer);
}
else {
printf("Error: %s\n", err_buffer);
}
#else
mac_tools_CompilerExceptionStream_writeBytes(env, thisRef, arrayRef, off, len);
#endif
return JavaStatusOk;
}
/*************************************************************************************
mac_tools_CompilerErrorStream_writeBytes_stub
*************************************************************************************/
static JavaStatus
mac_tools_CompilerErrorStream_writeBytes_stub(
JavaEnv env)
{
JavaStatus err;
JavaInt _local_3 = JavaEnv_popInt(env);
JavaInt _local_2 = JavaEnv_popInt(env);
JavaRef _local_1 = JavaEnv_popRef(env);
JavaRef _local_0 = JavaEnv_popRef(env);
err = mac_tools_CompilerErrorStream_writeBytes(env, _local_0, _local_1, _local_2, _local_3);
return err;
}
/*************************************************************************************
mac_tools_CompilerExceptionStream_writeBytes_stub
*************************************************************************************/
static JavaStatus
mac_tools_CompilerExceptionStream_writeBytes_stub(
JavaEnv env)
{
JavaStatus err;
JavaInt _local_3 = JavaEnv_popInt(env);
JavaInt _local_2 = JavaEnv_popInt(env);
JavaRef _local_1 = JavaEnv_popRef(env);
JavaRef _local_0 = JavaEnv_popRef(env);
err = mac_tools_CompilerExceptionStream_writeBytes(env, _local_0, _local_1, _local_2, _local_3);
return err;
}
/*************************************************************************************
BuildClassPathStringHandle
*************************************************************************************/
short
BuildClassPathStringHandle(
Handle classPath,
JavaRuntime runtime,
FSSpec *inFSSpec)
{
Handle curr;
OSErr err;
long resultSize;
FSSpec spec, *specPtr;
short resultPaths = 0;
specPtr = JavaRuntime_getJavaDirectory(runtime);
if(specPtr) {
spec = *specPtr;
BlockMoveData("\pclasses.zip",&spec.name, 12);
// pstrcpy((char *)specPtr->name, (char *)"\pclasses.zip");
curr = GetFullUnixPath(&spec);
if(curr) {
err = HandAndHand(curr, classPath);
PtrAndHand(":", classPath, 1);
DisposeHandle(curr);
resultPaths++;
}
}
if(inFSSpec) {
curr = GetFullUnixPathFromDirID(inFSSpec->vRefNum, inFSSpec->parID);
if(curr) {
err = HandAndHand(curr, classPath);
PtrAndHand(":", classPath, 1);
DisposeHandle(curr);
resultPaths++;
}
}
resultSize = GetHandleSize(classPath);
if(resultSize > 0) {
(*classPath)[resultSize-1] = 0;
SetHandleSize(classPath, resultSize - 1); //Get rid of the last :
}
return resultPaths;
}
/*************************************************************************************
Java_ProcessFile
*************************************************************************************/
OSErr
Java_ProcessFile(
FSSpec *inFSSpec)
{
JavaEnv env;
JavaStatus err;
JavaRef argRef;
JavaRef argvRef;
JavaRef classRef;
JavaRuntime runtime;
Handle thePath, classPath;
short argCount = 4;
Boolean depends, nowarn, debugInfo, optimize;
thePath = GetFullPathName(inFSSpec);
if (thePath == NULL)
{
err = 15004;
goto done; // hmmmm....goto....
}
//////////////////////////////////////////////////////////////////////
// Get a JavaRuntime instance for use by our droplet.
//////////////////////////////////////////////////////////////////////
if ((runtime = GetJavaRuntime()) == NULL)
{
return 15003;
}
classPath = NewHandle(0);
BuildClassPathStringHandle(classPath, runtime, inFSSpec);
//////////////////////////////////////////////////////////////////////
// tell the Java runtime what kind of file to create
// and where to create them.
//////////////////////////////////////////////////////////////////////
JavaRuntime_setOutputFileType(runtime, 'Clss');
JavaRuntime_setHomeDirectory(runtime, inFSSpec);
//////////////////////////////////////////////////////////////////////
// ask the runtime to find a java class
//////////////////////////////////////////////////////////////////////
err = JavaRuntime_findClass(runtime, &classRef, "mac/tools/CompilerErrorStream");
if (err != JavaStatusOk)
{
goto done;
}
err = JavaRuntime_setMethod(runtime, classRef,
"writeBytes", "([BII)V", mac_tools_CompilerErrorStream_writeBytes_stub,
NULL, JavaAccessMember);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaRuntime_findClass(runtime, &classRef, "mac/tools/CompilerExceptionStream");
if (err != JavaStatusOk)
{
goto done;
}
err = JavaRuntime_setMethod(runtime, classRef,
"writeBytes", "([BII)V", mac_tools_CompilerExceptionStream_writeBytes_stub,
NULL, JavaAccessMember);
if (err != JavaStatusOk)
{
goto done;
}
//////////////////////////////////////////////////////////////////////
// this may look stupid, but really it's not. :-)
// In Roaster, you set these up via the preferences dialog
// box. Here, we don't get that fancy. But we have left the
// code here to show how we deal with those options in interacting
// with the Java Runtime
//////////////////////////////////////////////////////////////////////
depends = false;
nowarn = false;
debugInfo = true;
optimize = false;
if (depends) argCount++;
if (nowarn) argCount++;
if (debugInfo) argCount++;
if (optimize) argCount++;
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
env = JavaEnv_make(runtime, (JavaOSThread) NULL);
if (env == NULL)
{
err = JavaStatusOutOfMemory;
goto done;
}
err = JavaArray_makeUTF(env, &argvRef, "[Ljava/lang/String;", argCount);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaString_makeUTF(env, &argRef, "-verbose", -1);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaArray_setElement(env, argvRef, 0, argRef);
if (err != JavaStatusOk)
{
goto done;
}
argCount = 1;
if (depends) // check dependencies
{
err = JavaString_makeUTF(env, &argRef, "-depend", -1);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaArray_setElement(env, argvRef, argCount++, argRef);
if (err != JavaStatusOk)
{
goto done;
}
}
if (nowarn) // show warnings?
{
err = JavaString_makeUTF(env, &argRef, "-nowarn", -1);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaArray_setElement(env, argvRef, argCount++, argRef);
if (err != JavaStatusOk)
{
goto done;
}
}
if (debugInfo) // show debug information
{
err = JavaString_makeUTF(env, &argRef, "-g", -1);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaArray_setElement(env, argvRef, argCount++, argRef);
if (err != JavaStatusOk)
{
goto done;
}
}
if (optimize) // optimize the compile?
{
err = JavaString_makeUTF(env, &argRef, "-O", -1);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaArray_setElement(env, argvRef, argCount++, argRef);
if (err != JavaStatusOk)
{
goto done;
}
}
if (classPath)
{
err = JavaString_makeUTF(env, &argRef, "-classpath", -1);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaArray_setElement(env, argvRef, argCount++, argRef);
if (err != JavaStatusOk)
{
goto done;
}
HLock(classPath);
err = JavaString_makeUTF(env, &argRef, *classPath, GetHandleSize(classPath));
DisposeHandle(classPath);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaArray_setElement(env, argvRef, argCount++, argRef);
if (err != JavaStatusOk)
{
goto done;
}
}
HLock(thePath);
err = JavaString_makeUTF(env, &argRef, *thePath, GetHandleSize(thePath));
DisposeHandle(thePath);
if (err != JavaStatusOk)
{
goto done;
}
err = JavaArray_setElement(env, argvRef, argCount++, argRef);
if (err != JavaStatusOk)
{
goto done;
}
SetCursor(*GetCursor(watchCursor));
err = JavaObject_callStaticUTF(env, NULL, "mac/tools/javac",
"main", "([Ljava/lang/String;)V", argvRef);
JavaEnv_dispose(env);
JavaRuntime_setOutputFileType(runtime, 'TEXT');
InitCursor();
done:
return err;
}